<?php

/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
    const ERROR_ALREADY_LOGGED=999;
        /**
	 * Authenticates a user.
	 * The example implementation makes sure if the username and password
	 * are both 'demo'.
	 * In practical applications, this should be changed to authenticate
	 * against some persistent user identity storage (e.g. database).
	 * @return boolean whether authentication succeeds.
	 */
	public function authenticate()
	{
            Yii::log('username ' . $this->username);
            Yii::log('password ' . $this->password);
            $usuario = $this->findUserByName($this->username);
            Yii::log('$usuario ' . print_r($usuario, true));
            if(!$usuario) 
                $this->errorCode=self::ERROR_USERNAME_INVALID;
            elseif(strcmp($this->password, $usuario->password)) 
                $this->errorCode=self::ERROR_PASSWORD_INVALID;
            else 
            {
                // Verifica si ya esta logeado
                if($usuario->logeado) {    
                    Yii::log('El usuario ya esta logeado');
                    if($this->dateTimeDiff($usuario->fecha, $usuario->hora) > 1800000) {
                        Yii::log('El usuario tiene mas de 30 mins logeado');
                        $usuario->logeado = false;
                    }
                }
                
                if($usuario->logeado) {
                    Yii::log('El usuario no se puede logear en este momento');
                    $this->errorCode=self::ERROR_ALREADY_LOGGED;
                }
                else  {
                    // Actualiza la tabla de historico
                    $this->updateHistorical($usuario);
                    // Actualiza la tabla de usuario
                    $this->updateUser($usuario);
                    // Crea la sesion
                    Yii::app()->session['nombre'] = $usuario->nombre;
                    Yii::app()->session['usuario_id'] = $usuario->id;
                    Yii::app()->session['tipousuario_id'] = $usuario->tipousuario_id;
                    Yii::app()->session['principal'] = $usuario->principal;
                    $this->errorCode=self::ERROR_NONE;
                    //$this->errorCode=self::ERROR_ALREADY_LOGGED;
                }
            }
            return !$this->errorCode;
	}
        
        private function findUserByName($usuario) {
             return Usuario::model()->find('nombre=:user', 
                                array(':user'=>$usuario));
        }
        
        private function updateHistorical($usuario)
        {
            $historicousuarios = new Historicousuarios();
            $historicousuarios->usuario_id = $usuario->id;
            $historicousuarios->fecha = date('Y-m-d');
            $historicousuarios->hora = date('H:i:s');
            $historicousuarios->movimiento = 'ENTRADA';
        }
        
        private function updateUser($usuario)
        {
            $usuario->logeado = TRUE;
            $usuario->fecha =  date('Y-m-d');
            $usuario->hora = date('H:i:s');
        }
        
        private function dateTimeDiff($date, $time)
        {
            $ultimo_log = new DateTime($date . ' ' . $time);
            $ahora = new DateTime('NOW');
            return $ahora->format('U') -$ultimo_log->format('U');
        }
}